/**
 * 文档转换工具包的MCP集成
 * 提供Markdown转换为PDF和DOCX的MCP工具定义
 */

import type { ToolPackage } from '../../core/tool-registry.js';
import { createTool, field } from '../../core/tool-schema.js';
import { ConvertTool } from './tool.js';
import {
  convertMarkdownToPpt as pptFromMarkdown,
  convertMarkdownFileToPpt as pptFromMarkdownFile,
  convertJsonToPpt as pptFromJson,
  generatePptFromTemplate as pptFromTemplate,
} from './ppt/index.js';

const convertTool = new ConvertTool();

/**
 * 转换Markdown内容为PDF
 */
const markdownToPdf = createTool()
  .name('convert_markdown_to_pdf')
  .title('Markdown转PDF')
  .description('将Markdown内容转换为PDF文档')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('文档转换')
  .tags(['markdown', 'pdf', 'convert'])
  .parameter(
    'markdown',
    field.required(
      field.string({
        description: 'Markdown内容字符串',
      })
    )
  )
  .parameter(
    'outputPath',
    field.required(
      field.string({
        description: '输出PDF文件的完整路径',
      })
    )
  )
  .parameter(
    'options',
    field.optional(
      field.object(
        {
          format: field.optional(
            field.string({
              description: 'PDF页面格式',
              enum: ['A4', 'A3', 'A5', 'Letter', 'Legal'],
            })
          ),
          landscape: field.optional(
            field.boolean({
              description: '是否横向显示（默认false）',
            })
          ),
          printBackground: field.optional(
            field.boolean({
              description: '是否打印背景色（默认true）',
            })
          ),
          title: field.optional(
            field.string({
              description: '文档标题',
            })
          ),
        },
        {
          description: 'PDF转换选项',
        }
      )
    )
  )
  .build(async params => {
    return await convertTool.markdownToPdf(params as any);
  });

/**
 * 转换Markdown内容为DOCX
 */
const markdownToDocx = createTool()
  .name('convert_markdown_to_docx')
  .title('Markdown转DOCX')
  .description('将Markdown内容转换为Word文档格式')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('文档转换')
  .tags(['markdown', 'docx', 'word', 'convert'])
  .parameter(
    'markdown',
    field.required(
      field.string({
        description: 'Markdown内容字符串',
      })
    )
  )
  .parameter(
    'outputPath',
    field.required(
      field.string({
        description: '输出DOCX文件的完整路径',
      })
    )
  )
  .parameter(
    'options',
    field.optional(
      field.object(
        {
          title: field.optional(
            field.string({
              description: '文档标题',
            })
          ),
          creator: field.optional(
            field.string({
              description: '文档作者',
            })
          ),
          description: field.optional(
            field.string({
              description: '文档描述',
            })
          ),
          chineseFont: field.optional(
            field.string({
              description: '中文字体名称',
            })
          ),
          englishFont: field.optional(
            field.string({
              description: '英文字体名称',
            })
          ),
          fontSize: field.optional(
            field.number({
              description: '字体大小',
            })
          ),
        },
        {
          description: 'DOCX转换选项',
        }
      )
    )
  )
  .build(async params => {
    return await convertTool.markdownToDocx(params as any);
  });

/**
 * 转换Markdown文件为PDF
 */
const markdownFileToPdf = createTool()
  .name('convert_markdown_file_to_pdf')
  .title('Markdown文件转PDF')
  .description('将Markdown文件转换为PDF文档')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('文档转换')
  .tags(['markdown', 'pdf', 'file', 'convert'])
  .parameter(
    'filePath',
    field.required(
      field.string({
        description: 'Markdown文件的完整路径',
      })
    )
  )
  .parameter(
    'outputPath',
    field.required(
      field.string({
        description: '输出PDF文件的完整路径',
      })
    )
  )
  .parameter(
    'options',
    field.optional(
      field.object(
        {
          format: field.optional(
            field.string({
              description: 'PDF页面格式',
              enum: ['A4', 'A3', 'A5', 'Letter', 'Legal'],
            })
          ),
          landscape: field.optional(
            field.boolean({
              description: '是否横向显示',
            })
          ),
          printBackground: field.optional(
            field.boolean({
              description: '是否打印背景色',
            })
          ),
        },
        {
          description: 'PDF转换选项',
        }
      )
    )
  )
  .build(async params => {
    return await convertTool.markdownFileToPdf(params as any);
  });

/**
 * 转换Markdown文件为DOCX
 */
const markdownFileToDocx = createTool()
  .name('convert_markdown_file_to_docx')
  .title('Markdown文件转DOCX')
  .description('将Markdown文件转换为Word文档格式')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('文档转换')
  .tags(['markdown', 'docx', 'file', 'convert'])
  .parameter(
    'filePath',
    field.required(
      field.string({
        description: 'Markdown文件的完整路径',
      })
    )
  )
  .parameter(
    'outputPath',
    field.required(
      field.string({
        description: '输出DOCX文件的完整路径',
      })
    )
  )
  .parameter(
    'options',
    field.optional(
      field.object(
        {
          title: field.optional(
            field.string({
              description: '文档标题',
            })
          ),
          creator: field.optional(
            field.string({
              description: '文档作者',
            })
          ),
          chineseFont: field.optional(
            field.string({
              description: '中文字体名称',
            })
          ),
          fontSize: field.optional(
            field.number({
              description: '字体大小',
            })
          ),
        },
        {
          description: 'DOCX转换选项',
        }
      )
    )
  )
  .build(async params => {
    return await convertTool.markdownFileToDocx(params as any);
  });

// PPT: Markdown 转 PPT
const markdownToPpt = createTool()
  .name('convert_markdown_to_ppt')
  .title('Markdown转PPT')
  .description('将Markdown内容转换为PPTX演示文稿')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('文档转换')
  .tags(['markdown', 'ppt', 'pptx', 'convert'])
  .parameter(
    'markdown',
    field.required(
      field.string({ description: 'Markdown内容字符串' })
    )
  )
  .parameter(
    'outputPath',
    field.required(
      field.string({ description: '输出PPTX文件的完整路径' })
    )
  )
  .parameter(
    'options',
    field.optional(
      field.object(
        {
          title: field.optional(field.string({ description: 'PPT标题' })),
          author: field.optional(field.string({ description: '作者' })),
          theme: field.optional(field.string({ description: '主题', enum: ['default','business','modern','minimal'] })),
          size: field.optional(field.string({ description: '尺寸', enum: ['standard','widescreen'] })),
          includePageNumbers: field.optional(field.boolean({ description: '是否添加页码' })),
          h1AsNewSlide: field.optional(field.boolean({ description: 'H1是否新开一页' })),
          h2AsNewSlide: field.optional(field.boolean({ description: 'H2是否新开一页' })),
        },
        { description: 'PPT转换选项' }
      )
    )
  )
  .build(async (params: any) => {
    return await pptFromMarkdown(params);
  });

// PPT: Markdown文件 转 PPT
const markdownFileToPpt = createTool()
  .name('convert_markdown_file_to_ppt')
  .title('Markdown文件转PPT')
  .description('将Markdown文件转换为PPTX演示文稿')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('文档转换')
  .tags(['markdown', 'ppt', 'pptx', 'file', 'convert'])
  .parameter(
    'filePath',
    field.required(field.string({ description: 'Markdown文件完整路径' }))
  )
  .parameter(
    'outputPath',
    field.required(field.string({ description: '输出PPTX文件的完整路径' }))
  )
  .parameter(
    'options',
    field.optional(
      field.object(
        {
          title: field.optional(field.string({ description: 'PPT标题' })),
          author: field.optional(field.string({ description: '作者' })),
          theme: field.optional(field.string({ description: '主题', enum: ['default','business','modern','minimal'] })),
          size: field.optional(field.string({ description: '尺寸', enum: ['standard','widescreen'] })),
          includePageNumbers: field.optional(field.boolean({ description: '是否添加页码' })),
          h1AsNewSlide: field.optional(field.boolean({ description: 'H1是否新开一页' })),
          h2AsNewSlide: field.optional(field.boolean({ description: 'H2是否新开一页' })),
        },
        { description: 'PPT转换选项' }
      )
    )
  )
  .build(async (params: any) => {
    return await pptFromMarkdownFile(params);
  });

// PPT: JSON 转 PPT（模板驱动）
const jsonToPpt = createTool()
  .name('convert_json_to_ppt')
  .title('JSON转PPT（模板）')
  .description('根据模板将JSON数组数据转换为PPTX演示文稿')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('文档转换')
  .tags(['json', 'ppt', 'pptx', 'template', 'convert'])
  .parameter(
    'data',
    field.required(field.array(field.object({})))
  )
  .parameter(
    'templateName',
    field.required(field.string({ description: '模板名称（对应 templates/ppt/<name>.json）' }))
  )
  .parameter(
    'outputPath',
    field.required(field.string({ description: '输出PPTX文件的完整路径' }))
  )
  .parameter(
    'options',
    field.optional(
      field.object(
        {
          title: field.optional(field.string({ description: 'PPT标题' })),
          author: field.optional(field.string({ description: '作者' })),
          theme: field.optional(field.string({ description: '主题', enum: ['default','business','modern','minimal'] })),
          size: field.optional(field.string({ description: '尺寸', enum: ['standard','widescreen'] })),
          includePageNumbers: field.optional(field.boolean({ description: '是否添加页码' })),
        },
        { description: 'PPT转换选项' }
      )
    )
  )
  .build(async (params: any) => {
    return await pptFromJson(params);
  });

// PPT: 直接基于模板生成
const generatePpt = createTool()
  .name('generate_ppt_from_template')
  .title('基于模板生成PPT')
  .description('传入模板名称与数据，直接生成PPTX文件')
  .version('1.0.0')
  .author('Test Case Writer Team')
  .category('文档转换')
  .tags(['ppt', 'pptx', 'template', 'generate'])
  .parameter(
    'templateName',
    field.required(field.string({ description: '模板名称' }))
  )
  .parameter(
    'data',
    field.required(field.array(field.object({})))
  )
  .parameter(
    'outputPath',
    field.required(field.string({ description: '输出PPTX文件的完整路径' }))
  )
  .parameter(
    'options',
    field.optional(field.object({}))
  )
  .build(async (params: any) => {
    return await pptFromTemplate(params);
  });

// 导出工具包
export const tools = [
  markdownToPdf, 
  markdownToDocx, 
  markdownFileToPdf, 
  markdownFileToDocx,
  markdownToPpt,
  markdownFileToPpt,
  jsonToPpt,
  generatePpt,
];

export const meta = {
  name: 'convert',
  version: '1.0.0',
  description: 'Markdown文档转换工具包',
  author: 'Test Case Writer Team',
};

// 默认导出
const toolPackage: ToolPackage = {
  tools,
  meta,
};

export default toolPackage;
